home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / GEMFUNCS / OBJCLCAL.C < prev    next >
C/C++ Source or Header  |  1992-11-19  |  3KB  |  94 lines

  1. /**************************************************************************
  2.  * OBJCLCAL.C - Calc clipping rectangle(s) for object in a tree.
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. short obj_clcalc(ptree, object, pgrect, pvrect)
  8.     register OBJECT *ptree;
  9.     short               object;
  10.     GRECT            *pgrect;
  11.     VRECT            *pvrect;
  12. {
  13.     short               adjust;
  14.     _Ob_spec_t         ospec;
  15.     short               ob_type;
  16.     short               ob_flags;
  17.     GRECT             workrect;
  18.  
  19.     obj_offxywh(ptree, object, &workrect);    /* get basic placement/sizes */
  20.  
  21.     ptree     = &ptree[object];                /* registerize/precalc some  */
  22.     ob_type  = ptree->ob_type & 0x00FF;     /* miscellanious things we     */
  23.     ob_flags = ptree->ob_flags;             /* us a lot below.             */
  24.     ospec     = ptree->_Ob_spec;
  25.  
  26.     if (ob_flags & INDIRECT) {                /* if INDIRECT flag is set,  */
  27.         ospec = *(_Ob_spec_t *)ospec;          /* go get the real _Ob_spec.    */
  28.     }
  29.  
  30.     if (ob_type == G_USERDEF) {
  31.         register XUSERBLK *pxub = (XUSERBLK *)ospec;
  32.         if (pxub->ub_self == pxub) {
  33.             ob_type = pxub->ob_type;
  34.             ospec = pxub->ob_spec;
  35.         }
  36.     }
  37.  
  38.     /*
  39.      * deal with objects that can have graphics that extend outside
  40.      * their ob_width/ob_height values...
  41.      */
  42.  
  43.     switch (ob_type) {
  44.       case G_BOXTEXT:
  45.       case G_FBOXTEXT:
  46.         adjust = ((TEDINFO*)ospec)->te_thickness;
  47.         break;
  48.       case G_BOX:
  49.       case G_IBOX:
  50.       case G_BOXCHAR:
  51.         adjust = (short)((char)((long)ospec >> 16));
  52.         break;
  53.       case G_BUTTON:
  54.         adjust = -1;
  55.         if (ob_flags & EXIT)
  56.             --adjust;
  57.         if (ob_flags & DEFAULT)
  58.             --adjust;
  59.         break;
  60.       default:
  61.         adjust = 0;
  62.         break;
  63.     }
  64.  
  65.     if (adjust > 0) {        /* if adjust value is positive, object has      */
  66.         adjust = 0;         /* "inner width" and no adjustment is needed. */
  67.     } else {                /* negative value implies outer width, invert */
  68.         adjust = -adjust;    /* it to a positive number for rc_gadjust().  */
  69.     }
  70.  
  71.     if (ptree->ob_state & OUTLINED) {              /* OUTLINED objects get  */
  72.         adjust = 4;                                   /* a fixed adjustment.   */
  73.     }
  74.  
  75.     rc_gadjust(&workrect, adjust, adjust);         /* apply adjustment      */
  76.  
  77.     if (ptree->ob_state & SHADOWED) {             /* apply special adjust  */
  78.         workrect.g_w += gl_wbox / 2;             /* for SHADOWED objects. */
  79.         workrect.g_h += gl_hbox / 2;
  80.     }
  81.  
  82.     if (pgrect != NULL) {                         /* if caller wants GRECT,*/
  83.         *pgrect = workrect;                      /* copy results to it.   */
  84.     }
  85.  
  86.     if (pvrect != NULL) {                         /* if caller wants VRECT,*/
  87.         rc_gtov(&workrect, pvrect);              /* convert results to it.*/
  88.     }
  89.  
  90.     return adjust;
  91. }
  92.  
  93.  
  94.